#ifndef _UART_H
#define _UART_H

#include "types.h"

// UART 基地址 (基于 QEMU virt 机器)
#define UART_BASE 0x10000000

// UART 寄存器偏移量定义
#define UART_RHR 0   // 接收保持寄存器 (Read)
#define UART_THR 0   // 发送保持寄存器 (Write)
#define UART_IER 1   // 中断使能寄存器
#define UART_FCR 2   // FIFO 控制寄存器
#define UART_ISR 2   // 中断状态寄存器
#define UART_LCR 3   // 线控制寄存器
#define UART_MCR 4   // 调制解调器控制寄存器
#define UART_LSR 5   // 线状态寄存器 (Line Status Register)
#define UART_MSR 6   // 调制解调器状态寄存器
#define UART_SPR 7   // 暂存寄存器

// LSR 寄存器位掩码
#define UART_LSR_RX_READY 0x01  // 接收数据就绪 (Data Ready)
#define UART_LSR_TX_EMPTY 0x20  // 发送保持寄存器空 (Transmit Empty)
#define UART_LSR_TX_IDLE  0x40  // 发送器空闲 (Transmitter Idle)

// 函数声明

/**
 * 初始化UART硬件
 * 配置波特率、数据格式、使能中断等
 */
void uart_init(void);

/**
 * 发送一个字符
 * @param c 要发送的字符
 */
void uart_putc(char c);

/**
 * 发送字符串
 * @param str 以空字符结尾的字符串
 */
void uart_puts(const char *str);

/**
 * 接收一个字符（阻塞）
 * @return 接收到的字符
 */
char uart_getc(void);

/**
 * 检查是否有数据可读（非阻塞）
 * @return 1-有数据, 0-无数据
 */
int uart_can_recv(void);

/**
 * 检查是否可以发送数据（非阻塞）
 * @return 1-可以发送, 0-不能发送  
 */
int uart_can_send(void);

#endif // _UART_H
